package ALBasicServer.ALProcess;

/************
 * 多步骤处理对象
 * @author mj
 *
 */
public class ALStepCounter 
{
    /** 所有步骤完成后的回调对象 */
    private _IALProcessAction _m_dOnAllStepDone;


    /** 总的需要的步骤数量 */
    private int _m_iTotalStepCount;
    /** 目前完成的步骤数量 */
    private int _m_iCurDoneStepCount;
    /** 是否已经完成了所有步骤 */
    private boolean _m_bIsAllStepDone;

    public ALStepCounter()
    {
        _m_dOnAllStepDone = null;

        resetStepInfo();
    }

    /****************
     * 重置所有步骤的统计信息
     **/
    public void resetStepInfo()
    {
        //初始化步骤数量变量
        synchronized (this)
        {
            _m_iTotalStepCount = 0;
            _m_iCurDoneStepCount = 0;
            _m_bIsAllStepDone = false;
        }
    }
    /****************
    * 重置
    **/
    public void resetAll()
    {
        resetStepInfo();
        _m_dOnAllStepDone = null;
    }

    public boolean isAllStepDone() { return _m_bIsAllStepDone; }
    public int totalStep() { return _m_iTotalStepCount; }
    public int doneStep() { return _m_iCurDoneStepCount; }

    /****************
     * 修改总的需要完成的步骤数
     **/
    public void chgTotalStepCount(int _chgStepCount)
    {
        //初始化步骤数量变量
        synchronized (this)
        {
        	_m_iTotalStepCount += _chgStepCount;
        }
    }

    /****************
     * 增加一个已经完成的步骤数
     **/
    public void addDoneStepCount()
    {
        _IALProcessAction needDealAction = null;

        synchronized (this)
        {
            _m_iCurDoneStepCount++;

            //判断步骤数量是否达到总数量，达到则需要调用加载完成的事件函数
            if (_m_iCurDoneStepCount == _m_iTotalStepCount && !_m_bIsAllStepDone)
            {
                //设置判断参数
                _m_bIsAllStepDone = true;
                //获取当前需要处理的回调对象
                needDealAction = _m_dOnAllStepDone;
                _m_dOnAllStepDone = null;
            }
        }

        //判断是否需要执行操作
        if (null != needDealAction)
            needDealAction.dealAction();
        needDealAction = null;
    }

    /*******************
     * 注册监听是否全部加载完的回调函数
     **/
    public void setAllDoneDelegate(_IALProcessAction _delegate)
    {
        if (null == _delegate)
            return;

        if (isAllStepDone())
            _delegate.dealAction();
        else
            _m_dOnAllStepDone = _delegate;
    }
}
